=begin pod

=TITLE class IO::Spec::Cygwin

=SUBTITLE Platform specific operations on file and directory paths for Cygwin

    class IO::Spec::QNX is IO::Spec { }

This sub-class of L<IO::Spec> will be available from the
C<$*SPEC> variable for a perl running on C<Cygwin> .

B<NOTE:> the C<IO::Spec::*> classes provide low-level path operations. Unless
you're creating your own high-level path manipulation routines, you don't
need to use C<IO::Spec::*>. Use L«C<IO::Path>|/type/IO::Path» instead.

B<NOTE2:> no special validation is done by these classes (e.g. check whether
path contains a null character). It is the job of higher-level classes, like
L«C<IO::Path>|/type/IO::Path», to do that.

=head1 Methods

=head2 method abs2rel

Defined as:

    method abs2rel(IO::Path:D $path, IO::Path:D $base = $*CWD --> Str:D)

Returns a string that represents C<$path>, but relative to C<$base> path.
Both C<$path> and C<$base> may be relative paths. C<$base> defaults to C<$*CWD>.
Uses L«C<IO::Spec::Win32>|/type/IO::Spec::Win32»'s semantics.

=head2 method canonpath

Defined as:

    method canonpath(Str() $path, :$parent --> Str:D)

Returns a string that is a canonical representation of C<$path>. If C<:$parent>
is set to true, will also clean up references to parent directories. B<NOTE:>
the routine does not access the filesystem.

    IO::Spec::Cygwin.canonpath(｢C:\foo\\..\bar\..\ber｣).say;
    # OUTPUT: «C:/foo/../bar/../ber␤»

    IO::Spec::Cygwin.canonpath("foo///./../bar/../ber").say;
    # OUTPUT: «foo/../bar/../ber␤»

    IO::Spec::Cygwin.canonpath("foo///./../bar/../ber", :parent).say;
    # OUTPUT: «ber␤»

=head2 method catdir

Defined as:

    method catdir (*@parts --> Str:D)

Concatenates multiple path fragments and returns the canonical representation
of the resultant path as a string. The C<@parts> are L«C<Str>|/type/Str» objects
and are allowed to contain path separators.

    IO::Spec::Cygwin.catdir(<foo/bar ber perl>).say;
    # OUTPUT: «foo/bar/ber/perl␤»

=head2 method catpath

Defined as:

    method catpath (Str:D $volume, Str:D $dir, Str:D $file --> Str:D)

Same as L«C<IO::Spec::Win32.catpath>|/type/IO::Spec::Win32#method_catpath»,
except will also change all backslashes to slashes at the end:

    IO::Spec::Cygwin.catpath('C:', '/some/dir', 'foo.txt').say;
    # OUTPUT: «C:/some/dir/foo.txt␤»

    IO::Spec::Cygwin.catpath('C:', '/some/dir', '').say;
    # OUTPUT: «C:/some/dir␤»

    IO::Spec::Cygwin.catpath('', '/some/dir', 'foo.txt').say;
    # OUTPUT: «/some/dir/foo.txt␤»

    IO::Spec::Cygwin.catpath('E:', '', 'foo.txt').say;
    # OUTPUT: «E:foo.txt␤»

=head2 method is-absolute

Defined as:

    method is-absolute(Str:D $path --> Bool:D)

Returns C<True> if the C<$path> starts with a slash (C<"/">) or backslash
(C<"\">), even if they have combining character on them, optionally preceded by
a volume:

    say IO::Spec::Cygwin.is-absolute: "/foo";        # OUTPUT: «True␤»
    say IO::Spec::Cygwin.is-absolute: "/\x[308]foo"; # OUTPUT: «True␤»
    say IO::Spec::Cygwin.is-absolute: ｢C:\foo｣;      # OUTPUT: «True␤»
    say IO::Spec::Cygwin.is-absolute: "bar";         # OUTPUT: «False␤»

=head2 method join

Defined as:

    method join(|c)

Same as L«C<IO::Spec::Win32.join>|/type/IO::Spec::Win32#method_join», except
replaces backslashes with slashes in the final result.

=head2 method rel2abs

Defined as:

    method rel2abs(|c --> List:D)

Same as L«C<IO::Spec::Win32.rel2abs>|/type/IO::Spec::Win32#method_rel2abs»,
except replaces backslashes with slashes in the final result.

=head2 method split

Defined as:

    method split(|c --> List:D)

Same as L«C<IO::Spec::Win32.split>|/type/IO::Spec::Win32#method_split», except
replaces backslashes with slashes in all the values of the final result.

=head2 method splitpath

Defined as:

    method splitpath(|c --> List:D)

Same as L«C<IO::Spec::Win32.splitpath>|/type/IO::Spec::Win32#method_splitpath»,
except replaces backslashes with slashes in all the values of the final result.

=head2 method tmpdir

Defined as:

    method tmpdir(--> IO::Path:D)

Attempts to locate a system's temporary directory by checking several typical directories and environmental variables. Uses current directory if no suitable directories are found.

=end pod

# vim: expandtab shiftwidth=4 ft=perl6
